C++实现事件委托delegate

您所在的位置:网站首页 c++ 实现委托 C++实现事件委托delegate

C++实现事件委托delegate

2023-10-03 15:34| 来源: 网络整理| 查看: 265

一、概述

用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含一系列的回调函数。但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是很不错的一种方式。

二、源码

参考了duilib的CDelegate和C#的Deleagte得出如下实现:

https://download.csdn.net/download/u013113678/32921296

三、说明

这是性能非常好的delegate,且线程安全。调用时,几乎和把方法放在一个数组调用的性能没区别。目前在vs2019以及ubuntu g++ 9.3.0测试过,都可以正常编译运行。

提供了2个对象Delegate和Delegate_S,其中Delegate是非线程安全的,Delegate_S是线程安全的,这样设计的主要原因是,Delegate_S调用过程中未使用锁或tas、cas等线程安全机制,这样的代价就是牺牲了内存管理的能力,对象是持久时需要使用者释放内存。考虑到事件回调多用在客户端,客户端常规模式是单线程+异步请求,可以确保所有事件回调完全在主线程执行,所以另外提供了一个非线程安全模式的Delegate,不需要使用者管理内存。

接口的设计参照了duilib的MakeDelegate。实现参照了C#的Delegate,每次=、+=、-=都会产生一个新的Delegate对象,所以这个时候只要保证=、+=、-=都是原子操作且不清除旧的Delegate对象就实现了线程安全的无锁调用,这也就是线程安全模式下需要使用者管理内存的原因。

四、示例

1、函数指针

#include #include"Delegate.h" void test() { std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3